#include <iostream>
using namespace std;

template <typename T>   //给下方函数提供模板参数，告诉编译器该函数可以处理不同类型的数据
T getmax(T &a, T &b)
{
    return a > b ? a : b;
}

template <class Y>  //不仅可以使用typename关键字，还可以使用class关键字，对模板参数进行声明
void MySwap(Y &a, Y &b)
{
    Y temp = a;
    a = b;
    b = temp;
}

template <typename T> 
void Mysort(T *arr, int n)
{
    for (int i = 0; i < n - 1; i++)
    {
        for (int j = i + 1; j < n; j++)
        {
            if (arr[i] > arr[j])
            {
                MySwap(arr[i], arr[j]);
            }
        }
    }
}

int main()
{
    int a = 1, b = 2;
    MySwap(a, b);
    cout << "a = " << a << " b = " << b << endl;
    cout << getmax<int>(a, b) << endl;      //调用时使用<>符号，告诉编译器模板参数的具体类型
    float c = 3.5, d = 4.2;
    cout << getmax(c, d) << endl;           //也可以不使用<>符号，编译器会根据参数类型自动推断模板参数类型

    int arr[] = {5, 3, 8, 6, 2, 7, 1, 4};
    Mysort(arr, 8);
    for (int i = 0; i < 8; i++)
    {
        cout << arr[i] << " ";   //输出排序后的数组
    }
    cout << endl;

    float arr2[] = {5.2, 3.8, 8.6, 6.1, 2.3, 7.9, 1.4, 4.7};
    Mysort(arr2, 8);
    for (int i = 0; i < 8; i++)
    {
        cout << arr2[i] << " ";   //输出排序后的数组
    }
    cout << endl;

    return 0;
}